import base64
import json

from PySide6.QtWidgets import QWidget, QFileDialog, QTableWidgetItem
from Forms.CardPage import Ui_Form
from Utils.AiCloud import cardOrc


class CardPage(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        if parent is not None:
            self.setParent(parent)
        # 加载CardPage的ui文件
        self.ui = Ui_Form()
        # 装载ui到本对象
        self.ui.setupUi(self)
        # 设置表格列为2列
        self.ui.tableWidget.setColumnCount(2)
        # 设置表格的表头标题为“字段”和“信息”
        self.ui.tableWidget.setHorizontalHeaderLabels(['字段', '信息'])
        # 添加imageBase64属性用于存储IDCard图片的base64编码
        self.imageBase64 = ''
        # 初始化所有的信号槽连接
        self.initConnect()

    # 调用此方法将会初始化所有的信号槽的连接
    def initConnect(self):
        # 连接“选择图片按钮”的clicked信号与selectImage方法的信号槽
        self.ui.selectButton.clicked.connect(self.selectImage)
        # 连接“识别按钮”的clicked信号与createInfo方法的信号槽
        self.ui.createButton.clicked.connect(self.createInfo)

    # 选择图片方法，此方法用于选择图片
    def selectImage(self):
        # 创建一个打开文件对话框
        file = QFileDialog()
        file.exec()
        # 把选择的路径赋值给path变量
        path = file.selectedFiles()[0]
        # 设置图像框的图片路径
        self.ui.ImageWidget.setImagePath(path)
        # 把选择的图片进行base64编码并存储在imageBase64属性中
        with open(path, 'rb') as image:
            self.imageBase64 = base64.b64encode(image.read()).decode('utf-8')

    # 识别图片信息方法
    def createInfo(self):
        # 判断图片base64编码是否存在，如果不存在则终止识别
        if self.imageBase64 == '':
            return
        # 将图片的base64数据封装成字典，方便调用API传参
        params = {
            "ImageBase64": self.imageBase64
        }
        # 调用信息识别服务并拿到json格式的字符串将其转换成字典赋值给res变量
        res = json.loads(cardOrc(params))
        # 调用设置表格信息方法并把res作为参数传递，将数据渲染到表格中
        self.setInfo(res)

    # 设置表格信息方法
    def setInfo(self, res):
        # 设置表格行数为6行
        self.ui.tableWidget.setRowCount(6)
        # 将表格的第0行0列填充为“姓名”
        self.ui.tableWidget.setItem(0, 0, QTableWidgetItem('姓名'))
        # 将表格的第0行1列填充为res的“Name”键对应的值
        self.ui.tableWidget.setItem(0, 1, QTableWidgetItem(res['Name']))
        # 将表格的第1行0列填充为“性别”
        self.ui.tableWidget.setItem(1, 0, QTableWidgetItem('性别'))
        # 将表格的第1行1列填充为res的“sex”键对应的值
        self.ui.tableWidget.setItem(1, 1, QTableWidgetItem(res['Sex']))
        # 将表格的第2行0列填充为“民族”
        self.ui.tableWidget.setItem(2, 0, QTableWidgetItem('民族'))
        # 将表格的第2行1列填充为res的“Nation”键对应的值
        self.ui.tableWidget.setItem(2, 1, QTableWidgetItem(res['Nation']))
        # 将表格的第3行0列填充为“出生日期”
        self.ui.tableWidget.setItem(3, 0, QTableWidgetItem('出生日期'))
        # 将表格的第3行1列填充为res的“Birth”键对应的值
        self.ui.tableWidget.setItem(3, 1, QTableWidgetItem(res['Birth']))
        # 将表格的第4行0列填充为“住址”
        self.ui.tableWidget.setItem(4, 0, QTableWidgetItem('住址'))
        # 将表格的第4行1列填充为res的“Address”键对应的值
        self.ui.tableWidget.setItem(4, 1, QTableWidgetItem(res['Address']))
        # 将表格的第5行0列填充为“身份证号”
        self.ui.tableWidget.setItem(5, 0, QTableWidgetItem('身份证号'))
        # 将表格的第5行1列填充为res的“IdNum”键对应的值
        self.ui.tableWidget.setItem(5, 1, QTableWidgetItem(res['IdNum']))
